cmake
cmake简介
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
安装
多用conda 环境安装,宿主机往往因为OS的原因,导致cmake版本太老。
1 | conda install -c conda-forge cmake |
自动生成CMakeLists.txt
ccmake
1 | sudo apt-get install cmake-curses-gui |
打印详细编译信息
- 执行命令cmake时追加:
-DCMAKE_VERBOSE_MAKEFILE=ON
- 查看整个编译过程。你可以使用
cmake --trace-expand .
选项来详细追踪 CMake 的执行。 - 在CMakeLists.txt中添加:
set(CMAKE_VERBOSE_MAKEFILE ON)
cmake结束之后,单独运行make
时追加: VERBOSE=1
就会显示最基本的编译命令。加上--dry-run
选项 能快速只打印编译命令。
1 | make --dry-run VERBOSE=1 |
list all option
1 | mkdir build |
快速编译
0. Fast Recompile
由于cmake实际就是将一堆cpp编译成.so或者exe的目标文件;为此CMake生成的Makefile,对每个target提供了fast编译选项, 例如 make cpprinter/fast
。
1 | # target_link_libraries(your_project PRIVATE cpprinter) |
1. 剔除不必要的组件和功能
PyTorch 是一个庞大的项目,可能包含很多你不需要的模块。你可以通过调整 CMake
配置选项来禁用不必要的部分。例如,如果你不需要 GPU 支持,可以禁用 CUDA:
1 | cmake -DBUILD_CUDA=OFF . |
其他常见的选项还包括禁用 distributed
、test
、python
等模块。
2. 使用 Ninja
作为构建系统
- 如果你还在使用
make
,可以考虑切换到ninja
,因为ninja
通常比make
更快,尤其是对大型项目。 - 首先确保系统安装了
ninja
,然后在运行cmake
时指定ninja
作为生成器:
1 | cmake -G Ninja . |
Ninja
还能更好地利用并行编译,加速整个过程。
3. 使用 ccache
缓存编译结果
ccache
是一个编译结果缓存工具,可以显著加快重复编译的速度。你可以安装并启用 ccache,它会缓存已编译过的目标文件,下次编译时直接复用:
1 | sudo apt/yum install ccache |
接着重新配置并编译项目。
常用选项
1 | -S <path-to-source> = Explicitly specify a source directory.CMakeLists.txt路径 |
CMakeList.txt基本语法
基础设置
1 | # cmake required version |
自定义命令
add_custom_target
是 CMake 中用于定义一个自定义目标的命令。这个目标不直接对应于生成一个输出文件,而是可以用于执行自定义命令或操作。下面是你提供的代码的解释和如何使用 add_custom_target
的说明:
自定义命令:
1
2
3
4
5add_custom_command(
COMMAND make clean
COMMAND make
OUTPUT ${CMAN_DRV_KO}
WORKING_DIRECTORY ${CMAN_DRV_DIR})- 这个命令会在指定的工作目录下运行
make clean
和make
,并生成cman.ko
文件。
- 这个命令会在指定的工作目录下运行
自定义目标:
1
2
3
4add_custom_target(drv
DEPENDS ${CMAN_DRV_KO}
WORKING_DIRECTORY ${CMAN_DRV_DIR}
COMMENT "Compiling cman driver")drv
是自定义目标的名称。- 该目标依赖于
${CMAN_DRV_KO}
,这意味着在构建drv
时,会确保cman.ko
已经被生成。 - 如果 cman.ko 不存在或是过期的,CMake 会自动执行上一个自定义命令来生成它。
安装目标:
1
2
3
4
5add_custom_target(drv-install
DEPENDS ${CMAN_DRV_KO}
COMMAND make install
WORKING_DIRECTORY ${CMAN_DRV_DIR}
COMMENT "Installing cman driver")drv-install
是另一个自定义目标,用于安装驱动。- 这个目标也依赖于
${CMAN_DRV_KO}
,并在构建时运行make install
。
add_custom_target
允许你定义在构建过程中特定的自定义操作,比如编译和安装操作,而不直接生成输出文件。通过设置依赖关系,可以确保在运行自定义目标时所需的文件已经生成。这种方法在需要执行多个步骤或使用外部工具时特别有用。
目标设置
1 | #add target/final executable file |
链接库
1 | # add lib path to search lib file |
安装到系统
1 | # 安装目标, 在构建完成后,运行 `make install` 命令将自动执行 CMake 中定义的安装规则。 |
- 自定义安装路径:如果希望安装到其他目录,可以修改
DESTINATION
参数的值,或者在运行 CMake 时指定CMAKE_INSTALL_PREFIX
变量。例如:1
cmake -DCMAKE_INSTALL_PREFIX=/your/custom/path ..
通过这种方式,CMake 生成的 Makefile
将能够支持 make install
命令将文件安装到指定的系统目录。
技巧
多级目录编译
在CMakeLists.txt
里*.cpp
一定会被变量包含AUX_SOURCE_DIRECTORY
或者FILE
,然后跨层传递add_subdirectory
,变量组合SET
,直至被添加到可执行文件ADD_EXECUTABLE
或者add_library
里
1 | set(exampleDIR "xxx") |
1 | FILE(GLOB _dir1_srcs *.cpp) |
实例
需要进一步的研究学习
- 学习Quest cmake 添加openmp的编译选项核compile option
参考文献
https://www.cnblogs.com/lyq105/archive/2010/12/03/1895067.htmlhttps://blog.csdn.net/ET_Endeavoring/article/details/98989066
————————————————
版权声明:本文为CSDN博主「商汤科技」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq295109601/article/details/118867192